// 数据库管理模块
const path = require('path');
const fs = require('fs');

// 延迟加载sqlite3以避免在渲染进程中加载
let sqlite3;

class DatabaseManager {
    constructor() {
        this.db = null;
        this.dbPath = '';
        // 注意：在构造函数中不能直接初始化数据库，因为app可能还未准备好
    }

    // 初始化数据库（需要在app准备好后调用）
    init(app) {
        try {
            // 确保sqlite3已加载
            if (!sqlite3) {
                sqlite3 = require('sqlite3').verbose();
            }
            
            // 默认将数据库文件放在应用运行目录下
    this.dbPath = path.join(process.cwd(), 'tasks.db');
            
            console.log('数据库路径:', this.dbPath);
            
            // 初始化数据库连接
            this.db = new sqlite3.Database(this.dbPath, (err) => {
                if (err) {
                    console.error('数据库连接失败:', err);
                    this.db = null;
                } else {
                    console.log('数据库连接成功');
                    // 创建必要的表
                    this.createTables();
                }
            });
        } catch (error) {
            console.error('数据库初始化失败:', error);
            this.db = null;
        }
    }

    createTables() {
        if (!this.db) {
            console.error('数据库未初始化，无法创建表');
            return;
        }

        const tasksTable = `
            CREATE TABLE IF NOT EXISTS tasks (
                id INTEGER PRIMARY KEY AUTOINCREMENT,
                title TEXT NOT NULL,
                description TEXT,
                status TEXT DEFAULT 'pending',
                priority TEXT DEFAULT 'medium',
                dueDate TEXT,
                hours INTEGER DEFAULT 0,
                created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
                updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
            )
        `;

        const statusesTable = `
            CREATE TABLE IF NOT EXISTS statuses (
                id INTEGER PRIMARY KEY AUTOINCREMENT,
                name TEXT NOT NULL,
                color TEXT NOT NULL,
                description TEXT,
                is_default INTEGER DEFAULT 0
            )
        `;

        const usersTable = `
            CREATE TABLE IF NOT EXISTS users (
                id INTEGER PRIMARY KEY AUTOINCREMENT,
                name TEXT NOT NULL,
                department TEXT,
                position TEXT
            )
        `;

        this.db.serialize(() => {
            this.db.run(tasksTable, (err) => {
                if (err) {
                    console.error('创建任务表失败:', err);
                } else {
                    console.log('任务表创建成功');
                }
            });

            this.db.run(statusesTable, (err) => {
                if (err) {
                    console.error('创建状态表失败:', err);
                } else {
                    console.log('状态表创建成功');
                    // 插入默认状态
                    this.insertDefaultStatuses();
                }
            });

            this.db.run(usersTable, (err) => {
                if (err) {
                    console.error('创建用户表失败:', err);
                } else {
                    console.log('用户表创建成功');
                }
            });
        });
    }

    insertDefaultStatuses() {
        if (!this.db) return;
        
        const checkSql = `SELECT COUNT(*) as count FROM statuses`;
        this.db.get(checkSql, (err, row) => {
            if (!err && row.count === 0) {
                const defaultStatuses = [
                    ['工作中', '#28a745', '正在专注工作', 1],
                    ['会议中', '#17a2b8', '正在参加视频或现场会议', 1],
                    ['休息中', '#ffc107', '暂时离开，稍后回来', 1],
                    ['免打扰', '#dc3545', '请勿打扰，专注工作时间', 1]
                ];
                
                const stmt = this.db.prepare("INSERT INTO statuses (name, color, description, is_default) VALUES (?, ?, ?, ?)");
                defaultStatuses.forEach(status => {
                    stmt.run(status, (err) => {
                        if (err) {
                            console.error('插入默认状态失败:', err);
                        }
                    });
                });
                stmt.finalize();
                console.log('默认状态插入成功');
            }
        });
    }

    getAllTasks(callback) {
        if (!this.db) {
            console.error('数据库未初始化');
            callback(new Error('数据库未初始化'), []);
            return;
        }

        const sql = 'SELECT * FROM tasks ORDER BY created_at DESC';
        this.db.all(sql, [], (err, rows) => {
            if (err) {
                console.error('查询任务失败:', err);
                callback(err, []);
                return;
            }
            callback(null, rows);
        });
    }

    getTodayTasks(callback) {
        if (!this.db) {
            console.error('数据库未初始化');
            callback(new Error('数据库未初始化'), []);
            return;
        }

        const sql = `SELECT * FROM tasks WHERE date(created_at) = date('now') ORDER BY created_at DESC`;
        this.db.all(sql, (err, rows) => {
            if (err) {
                console.error('查询今日任务失败:', err);
                callback(err, []);
                return;
            }
            callback(null, rows);
        });
    }

    addTask(taskData, callback) {
        if (!this.db) {
            console.error('数据库未初始化');
            callback(new Error('数据库未初始化'));
            return;
        }

        const sql = 'INSERT INTO tasks (title, description, status, priority, hours) VALUES (?, ?, ?, ?, ?)';
        this.db.run(sql, [taskData.title, taskData.description || '', taskData.status || 'pending', taskData.priority || 'medium', parseInt(taskData.hours) || 0], (err) => {
            if (err) {
                console.error('添加任务失败:', err);
                callback(err);
                return;
            }
            callback(null);
        });
    }

    updateTask(id, updates, callback) {
        if (!this.db) {
            console.error('数据库未初始化');
            callback(new Error('数据库未初始化'));
            return;
        }

        // 构建更新语句
        const fields = [];
        const values = [];
        
        for (const [key, value] of Object.entries(updates)) {
            if (key !== 'id') {
                // 如果是hours字段，确保是整数
                if (key === 'hours') {
                    values.push(parseInt(value) || 0);
                } else {
                    values.push(value);
                }
                fields.push(`${key} = ?`);
            }
        }
        
        values.push(id);
        
        if (fields.length === 0) {
            callback(null);
            return;
        }

        const sql = `UPDATE tasks SET ${fields.join(', ')}, updated_at = CURRENT_TIMESTAMP WHERE id = ?`;
        this.db.run(sql, values, (err) => {
            if (err) {
                console.error('更新任务失败:', err);
                callback(err);
                return;
            }
            callback(null);
        });
    }

    deleteTask(id, callback) {
        if (!this.db) {
            console.error('数据库未初始化');
            callback(new Error('数据库未初始化'));
            return;
        }

        const sql = 'DELETE FROM tasks WHERE id = ?';
        this.db.run(sql, [id], (err) => {
            if (err) {
                console.error('删除任务失败:', err);
                callback(err);
                return;
            }
            callback(null);
        });
    }

    getAllStatuses(callback) {
        if (!this.db) {
            console.error('数据库未初始化');
            callback(new Error('数据库未初始化'), []);
            return;
        }

        const sql = 'SELECT * FROM statuses ORDER BY is_default DESC, id ASC';
        this.db.all(sql, [], (err, rows) => {
            if (err) {
                console.error('查询状态失败:', err);
                callback(err, []);
                return;
            }
            callback(null, rows);
        });
    }

    addCustomStatus(statusData, callback) {
        if (!this.db) {
            console.error('数据库未初始化');
            callback(new Error('数据库未初始化'));
            return;
        }

        const sql = 'INSERT INTO statuses (name, color, description, is_default) VALUES (?, ?, ?, 0)';
        this.db.run(sql, [statusData.name, statusData.color, statusData.description || ''], (err) => {
            if (err) {
                console.error('添加自定义状态失败:', err);
                callback(err);
                return;
            }
            callback(null);
        });
    }

    deleteCustomStatus(id, callback) {
        if (!this.db) {
            console.error('数据库未初始化');
            callback(new Error('数据库未初始化'));
            return;
        }

        const sql = 'DELETE FROM statuses WHERE id = ? AND is_default = 0';
        this.db.run(sql, [id], (err) => {
            if (err) {
                console.error('删除自定义状态失败:', err);
                callback(err);
                return;
            }
            callback(null);
        });
    }

    getUserInfo(callback) {
        if (!this.db) {
            console.error('数据库未初始化');
            callback(new Error('数据库未初始化'), null);
            return;
        }

        const sql = 'SELECT * FROM users ORDER BY id DESC LIMIT 1';
        this.db.get(sql, (err, row) => {
            if (err) {
                console.error('查询用户信息失败:', err);
                callback(err, null);
                return;
            }
            callback(null, row || null);
        });
    }

    updateUserInfo(userInfo, callback) {
        if (!this.db) {
            console.error('数据库未初始化');
            callback(new Error('数据库未初始化'));
            return;
        }

        // 先检查是否已存在用户信息
        const checkSql = `SELECT COUNT(*) as count FROM users`;
        this.db.get(checkSql, (err, row) => {
            if (err) {
                console.error('检查用户信息失败:', err);
                callback(err);
                return;
            }

            if (row.count > 0) {
                // 更新现有记录
                const updateSql = `
                    UPDATE users 
                    SET name = ?, department = ?, position = ?
                `;
                const params = [
                    userInfo.name || '',
                    userInfo.department || '',
                    userInfo.position || ''
                ];
                this.db.run(updateSql, params, callback);
            } else {
                // 插入新记录
                const insertSql = `
                    INSERT INTO users (name, department, position)
                    VALUES (?, ?, ?)
                `;
                const params = [
                    userInfo.name || '',
                    userInfo.department || '',
                    userInfo.position || ''
                ];
                this.db.run(insertSql, params, callback);
            }
        });
    }
}

// 导出单例实例
const databaseManager = new DatabaseManager();
module.exports = databaseManager;